<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/11/2
 * Time: 10:36
 */
namespace app\v1\controller;

use app\v1\model\Wxpay;
use app\v1\model\WxpayUnifieOrder;
use think\Request;
use Wechat\WechatPay;

class Userpay
{
    private function getUserpay()
    {
        return model("Userpay");
    }

    private function getCurlfunction()
    {
        return model("Curlfunction");
    }

    /*
     * 创建订单
     * */
    public function order(Request $request)
    {

        if ($request->isPost()) {
            if($request->param("_id")){
                //退款
               $data= $this->getUserpay()->getUserpayById($request->param("_id"));

              return  json_decode(json_encode($this->refund($data)))->result_code==="SUCCESS" ?
                  ($this->updateUserpay(['_id'=>$request->param("_id"),"orderStatus"=>2])? 200 : 404) : 406;
            }else {
                $data=$request->param();
                $data['out_trade_no']=substr($data['userId'],0,5) . date("YmdHis");//商户订单号
                if ($_id = $this->getUserpay()->addUserpay($data)) {
                    return json_encode(["id" => $_id, "payArr" => $this->callPay($data)]);//发起支付请求
                } else {
                    return json_encode(["state" => 404, "msg" => "创建订单失败"]);
                }
            }
        } else if ($request->isGet()) {
            if (is_numeric($request->param("orderStatus"))) {
                //获取指定类型的数据
                return json_encode($this->getUserpay()->optionsUserpay($request->param()));
            } else {
                return json_encode($this->getUserpay()->getUserpayById($request->param("_id")));
            }
        } else if ($request->isPut()) {
            return json_encode($this->getUserpay()->updateUserpay($request->param()));
        } else if ($request->isDelete()) {
            return json_encode($this->getUserpay()->delUserpay($request->param("_id")));
        }
    }

    public function callPay($data = [])
    {

        $arr = [];
        //查询小程序商户支付配置信息
        $configData = json_decode($this->getCurlfunction()->getApiByName(config("merchantDomain") . "/Merchantconfig/index/_id/" . $data['merchantId'] , "GET", $arr));
        config([
            'token' => '', //填写你设定的token
            'appid' => $configData->appid, //填写高级调用功能的app id, 请在微信开发模式后台查询
            'appsecret' => $configData->appsecret, //填写高级调用功能的密钥
            'encodingaeskey' => '', //填写加密用的EncodingAESKey（可选，接口传输选择加密时必需）
            'mch_id' => $configData->mchid,  //微信支付，商户ID（可选）
            'key' => $configData->partnerKey,  //微信支付，密钥（可选）
            'ssl_cer' => '', //微信支付，双向证书（可选，操作退款或打款时必需）
            'ssl_key' => "",  //微信支付，双向证书（可选，操作退款或打款时必需）
            'cachepath' => '', //设置SDK缓存目录（可选，默认位置在./Wechat/Cache下，请保证写权限）
        ]);
        $input = new WxpayUnifieOrder();
        $input->SetBody("充值单号:" . substr($data['userId'],0,5)  . time());//设置商品详情
        $input->SetAttach("充值单号:" . substr($data['userId'],0,5)  . time());
        $input->SetOut_trade_no($data['out_trade_no']);
        $input->SetTotal_fee($data['amount']);//设置金额 单位为分 $ofgArr[0]['ofg_price'] *100
        $input->SetTime_start(date("YmdHis"));
        $input->SetTime_expire(date("YmdHis", time() + 600));
        $input->SetGoods_tag("商品购买");//设置商品标签
        $input->SetNotify_url("http://m.idou/public/index.php/index/index/notify");
        $input->SetTrade_type("JSAPI");
        $input->SetOpenid($data['openId']);
        $order = $input->unifiedOrder($input);
        $wxpay = new Wxpay();
        $jsApiParameters = $wxpay->GetJsApiParameters($order);//js参数列表
        return $jsApiParameters;
    }

    /*
     * 退款接口
     * */
    public function refund($data=[]){

            $arr = [];
            $configData = json_decode($this->getCurlfunction()->getApiByName(config("merchantDomain") . "/Merchantconfig/index/_id/" . $data['merchantId'], "GET", $arr));
            config([
                'token' => '', //填写你设定的token
                'appid' => $configData->appid, //填写高级调用功能的app id, 请在微信开发模式后台查询
                'appsecret' => $configData->appsecret, //填写高级调用功能的密钥
                'encodingaeskey' => '', //填写加密用的EncodingAESKey（可选，接口传输选择加密时必需）
                'mch_id' => $configData->mchid,  //微信支付，商户ID（可选）
                'key' => $configData->partnerKey,  //微信支付，密钥（可选）
                'ssl_cer' => "/var/www/admin-merchant".$configData->ssl_cer, //微信支付，双向证书（可选，操作退款或打款时必需）
                'ssl_key' => "/var/www/admin-merchant".$configData->ssl_key,  //微信支付，双向证书（可选，操作退款或打款时必需）
                'cachepath' => '', //设置SDK缓存目录（可选，默认位置在./Wechat/Cache下，请保证写权限）
            ]);
            $total_fee = $data["amount"];
            $refund_fee = $data["amount"];
            $input = new WxpayUnifieOrder();
            $input->SetOut_trade_no($data['out_trade_no']);
            $input->SetTotal_fee($total_fee);
            $input->SetRefund_fee($refund_fee);
            $input->SetOut_refund_no(config("mch_id") . date("YmdHis"));
            $input->SetOp_user_id(config("mch_id"));
            return $input->refund($input);

    }

    /*
     * 支付通知
     * */
    public function notifyUrl()
    {
        // 实例支付接口
        $pay = &load_wechat('Pay');

// 获取支付通知
        $notifyInfo = $pay->getNotify();

// 支付通知数据获取失败
        if ($notifyInfo === FALSE) {
            // 接口失败的处理
            echo $pay->errMsg;
        } else {
            //支付通知数据获取成功
            if ($notifyInfo['result_code'] == 'SUCCESS' && $notifyInfo['return_code'] == 'SUCCESS') {
                // 支付状态完全成功，可以更新订单的支付状态了
                // @todo
                // 返回XML状态，至于XML数据可以自己生成，成功状态是必需要返回的。
                // <xml>
                //    return_code><![CDATA[SUCCESS]]></return_code>
                //    return_msg><![CDATA[OK]]></return_msg>
                // </xml>
                return xml(['return_code' => 'SUCCESS', 'return_msg' => 'DEAL WITH SUCCESS']);
            }
        }
    }


}